package pruebas;

import java.util.List;
import java.util.ArrayList;
import junit.framework.TestCase;
import org.junit.Test;
import excepciones.CantidadDePosicionesIncorrectasExcepcion;
import excepciones.TableroIndiceFueraDeRangoExcepcion;
import modelo.Barco;
import modelo.Buque;
import modelo.Destructor;
import modelo.Este;
import modelo.Lancha;
import modelo.Noreste;
import modelo.Noroeste;
import modelo.Norte;
import modelo.Oeste;
import modelo.Portaaviones;
import modelo.Posicion;
import modelo.RompeHielos;
import modelo.Sur;
import modelo.Sureste;
import modelo.Suroeste;
import modelo.Tablero;

public class BarcoTest extends TestCase {
	// Pruebas sobre explociones
    @Test
    public void testBarcoRecibirUnaExplosion() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	Barco unaLancha = null;
    	try {unaLancha = new Lancha(posiciones,new Suroeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
   		unaLancha.recibirDanioDisparo(posB);
   		
   		assertEquals("Posicion A esta sana",(unaLancha.getPosicionesSanas()).get(0),posA);
   		assertEquals("Posicion B esta rota",(unaLancha.getPosicionesRotas()).get(0),posB);                          
    } 

    @Test
    public void testBarcoRecibirDosExplosiones() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	Posicion posD = new Posicion(1,1);
    	Posicion posE = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	posiciones.add(posD);
    	posiciones.add(posE);
    	Barco unPortaaviones = null;
    	try {unPortaaviones = new Portaaviones(posiciones, new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unPortaaviones.recibirDanioPuntualConRetardo(posB);
   		unPortaaviones.recibirDanioDobleConRetardo(posE);

   		boolean estaA = false;
   		boolean estaC = false;
   		boolean estaD = false;
   		List<Posicion> posicionesSanas = unPortaaviones.getPosicionesSanas();
   		// Controla que A, C y D esten como posiciones sanas
   		for(int i=0; i<posicionesSanas.size(); i++){
   			if (posicionesSanas.get(i) == posA){
   				estaA = true;
   			}if (posicionesSanas.get(i) == posC){
   				estaC = true;
   			}if (posicionesSanas.get(i) == posD){
   				estaD = true;
   			}
   		}
   		assertTrue("Posicion A esta sana",estaA);
   		assertTrue("Posicion C esta sana",estaC);
   		assertTrue("Posicion D esta sana",estaD);
   		boolean estaB = false;
   		boolean estaE = false;
   		List<Posicion> posicionesRotas = unPortaaviones.getPosicionesRotas();
   		// Controla que A, C y D esten como posiciones rotas
   		for(int i=0; i<posicionesRotas.size(); i++){
   			if (posicionesRotas.get(i) == posB){
   				estaB = true;
   			}if (posicionesRotas.get(i) == posE){
   				estaE = true;
   			}
   		}
   		assertTrue("Posicion B esta sana",estaB);
   		assertTrue("Posicion E esta sana",estaE);
    }
    
    @Test
    public void testBarcoRecibirDosExplosionesEnElMismoLugar() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	Barco unaLancha = null;
    	try {unaLancha = new Lancha(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unaLancha.recibirDanioTripleConRetardo(posB);
   		unaLancha.recibirDanioMinaDeContacto(posB);
   		
   		assertEquals("Posicion A esta sana",(unaLancha.getPosicionesSanas()).get(0),posA);
   		assertEquals("Posicion B esta rota",(unaLancha.getPosicionesRotas()).get(0),posB);                          
    } 
    
    @Test
    public void testBarcoDestruir() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	Posicion posD = new Posicion(1,1);
    	Posicion posE = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	posiciones.add(posD);
    	posiciones.add(posE);
    	Barco unPortaaviones = null;
    	try {unPortaaviones = new Portaaviones(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unPortaaviones.recibirDanioDisparo(posA);
   		unPortaaviones.recibirDanioPuntualConRetardo(posB);
   		unPortaaviones.recibirDanioDobleConRetardo(posC);
   		unPortaaviones.recibirDanioTripleConRetardo(posD);
   		unPortaaviones.recibirDanioMinaDeContacto(posE);

   		assertTrue("El barco esta destruido",unPortaaviones.estaDestruido());
    } 
    
    @Test
    public void testRecibirExplocionEnPosicionIncorrecta() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	Barco unaLancha = null;
    	try {unaLancha = new Lancha(posiciones,new Oeste());
   		
   		unaLancha.recibirDanioDisparo(posC);
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
   		assertEquals("Posicion A esta sana",(unaLancha.getPosicionesSanas()).get(0),posA);
   		assertEquals("Posicion B esta sana",(unaLancha.getPosicionesSanas()).get(1),posB);                          
    }  
    
    @Test
    public void testBuqueDestruirConUnImpacto() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	Posicion posD = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	posiciones.add(posD);
    	Barco unBuque = null;
    	try {unBuque = new Buque(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
   		unBuque.recibirDanioPuntualConRetardo(posC);

   		assertTrue("El buque esta destruido",unBuque.estaDestruido());                    
    }      
    
    @Test
    public void testDestructorRecibirExplosionConMinasQueNoLoDanian() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unDestructor = null;
    	try {unDestructor = new Destructor(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
   		unDestructor.recibirDanioDobleConRetardo(posC);

   		boolean estaA = false;
   		boolean estaB = false;
   		boolean estaC = false;
   		List<Posicion> posicionesSanas = unDestructor.getPosicionesSanas();
   		// Controla que A, B y C esten como posiciones sanas
   		for(int i=0; i<posicionesSanas.size(); i++){
   			if (posicionesSanas.get(i) == posA){
   				estaA = true;
   			}if (posicionesSanas.get(i) == posB){
   				estaB = true;
   			}if (posicionesSanas.get(i) == posC){
   				estaC = true;
   			}
   		}
   		assertTrue("Posicion A esta sana",estaA);
   		assertTrue("Posicion B esta sana",estaB);
   		assertTrue("Posicion C esta sana",estaC);            
    }      
    
    @Test
    public void testDestructorRecibirDisparoDirecto() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unDestructor = null;
    	try {unDestructor = new Destructor(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
   		unDestructor.recibirDanioDisparo(posC);

   		assertEquals("Posicion A esta sana",(unDestructor.getPosicionesSanas()).get(0),posA);
   		assertEquals("Posicion B esta sana",(unDestructor.getPosicionesSanas()).get(1),posB);
   		assertEquals("Posicion C esta rota",(unDestructor.getPosicionesRotas()).get(0),posC);
    }      
    
    @Test
    public void testDestructorDestruir() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unDestructor = null;
    	try {unDestructor = new Destructor(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unDestructor.recibirDanioDisparo(posA);
   		unDestructor.recibirDanioDisparo(posB);
   		unDestructor.recibirDanioDisparo(posC);
   		
   		assertTrue("El destructor esta destruido",unDestructor.estaDestruido());            
    }    
    
    @Test
    public void testRompeHielosRecibirUnGolpe() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unRompeHielos.recibirDanioMinaDeContacto(posA);
   		
   		boolean estaB = false;
   		boolean estaC = false;
   		List<Posicion> posicionesSanas = unRompeHielos.getPosicionesSanas();
   		// Controla que A, B y C esten como posiciones sanas
   		for(int i=0; i<posicionesSanas.size(); i++){
   			if (posicionesSanas.get(i) == posB){
   				estaB = true;
   			}if (posicionesSanas.get(i) == posC){
   				estaC = true;
   			}
   		}
   		assertTrue("Posicion B esta sana",estaB);
   		assertTrue("Posicion C esta sana",estaC);
   	}    
    
    @Test
    public void testRompeHielosRomperUnaPosicion() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unRompeHielos.recibirDanioDisparo(posB);
   		unRompeHielos.recibirDanioPuntualConRetardo(posB);
   		
   		boolean estaA = false;
   		boolean estaC = false;
   		List<Posicion> posicionesSanas = unRompeHielos.getPosicionesSanas();
   		// Controla que A y C esten como posiciones sanas
   		for(int i=0; i<posicionesSanas.size(); i++){
   			if (posicionesSanas.get(i) == posA){
   				estaA = true;
   			}if (posicionesSanas.get(i) == posC){
   				estaC = true;
   			}
   		}
   		assertTrue("Posicion A esta sana",estaA);
   		assertTrue("Posicion C esta sana",estaC);

   		assertEquals("Posicion B esta rota",(unRompeHielos.getPosicionesRotas()).get(0),posB); 
    }    
    
    @Test
    public void testRompeHielosRecibirTresGolpesEnUnaPosicion() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unRompeHielos.recibirDanioDobleConRetardo(posC);
   		unRompeHielos.recibirDanioMinaDeContacto(posC);
   		unRompeHielos.recibirDanioTripleConRetardo(posC);
   		
   		boolean estaA = false;
   		boolean estaB = false;
   		List<Posicion> posicionesSanas = unRompeHielos.getPosicionesSanas();
   		// Controla que A y B esten como posiciones sanas
   		for(int i=0; i<posicionesSanas.size(); i++){
   			if (posicionesSanas.get(i) == posA){
   				estaA = true;
   			}if (posicionesSanas.get(i) == posB){
   				estaB = true;
   			}
   		}
   		assertTrue("Posicion A esta sana",estaA);
   		assertTrue("Posicion B esta sana",estaB);

   		assertEquals("Posicion C esta rota",(unRompeHielos.getPosicionesRotas()).get(0),posC);
    }
    
    @Test
    public void testRompeHielosUnGolpeEnCadaPosicionNoLoDestruye() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unRompeHielos.recibirDanioDisparo(posA);
   		unRompeHielos.recibirDanioMinaDeContacto(posB);
   		unRompeHielos.recibirDanioTripleConRetardo(posC);

   		assertFalse("El rompehielos no esta destruido",unRompeHielos.estaDestruido());
    }
    
    @Test
    public void testRompeHielosDestruir() {
    	Posicion posA = new Posicion(1,1);
    	Posicion posB = new Posicion(1,1);
    	Posicion posC = new Posicion(1,1);
    	ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
    	posiciones.add(posA);
    	posiciones.add(posB);
    	posiciones.add(posC);
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posiciones,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

   		unRompeHielos.recibirDanioDisparo(posA);
   		unRompeHielos.recibirDanioPuntualConRetardo(posA);
   		unRompeHielos.recibirDanioDobleConRetardo(posB);
   		unRompeHielos.recibirDanioMinaDeContacto(posB);
   		unRompeHielos.recibirDanioDisparo(posC);
   		unRompeHielos.recibirDanioTripleConRetardo(posC);

   		assertTrue("El rompehielos esta destruido",unRompeHielos.estaDestruido());
    }
    
    // Pruebas sobre movimiento.    
    @Test
    public void testAvanzarUnCasilleroAlNorte() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesDelBarco.add(tablero.getPosicion(7,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Norte());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(4,5));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(6,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarUnCasilleroAlSur() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesDelBarco.add(tablero.getPosicion(7,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Sur());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(7,5));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(8,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarUnCasilleroAlEste() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesDelBarco.add(tablero.getPosicion(5,4));
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Este());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,4));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,6));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarUnCasilleroAlOeste() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesDelBarco.add(tablero.getPosicion(5,4));
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,4));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarUnCasilleroAlSureste() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(7,8));
    		posicionesDelBarco.add(tablero.getPosicion(6,7));
    		posicionesDelBarco.add(tablero.getPosicion(5,6));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Sureste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(8,9));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(7,8));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(6,7));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarUnCasilleroAlSuroeste() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(7,4));
    		posicionesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesDelBarco.add(tablero.getPosicion(5,6));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Suroeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(8,3));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(7,4));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(6,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarUnCasilleroAlNoreste() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(7,4));
    		posicionesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesDelBarco.add(tablero.getPosicion(5,6));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Noreste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,6));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(4,7));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarUnCasilleroAlNoroeste() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(7,8));
    		posicionesDelBarco.add(tablero.getPosicion(6,7));
    		posicionesDelBarco.add(tablero.getPosicion(5,6));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unRompeHielos = null;
    	try {unRompeHielos = new RompeHielos(posicionesDelBarco,new Noroeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(6,7));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,6));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(4,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

   		unRompeHielos.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unRompeHielos.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    @Test
    public void testAvanzarDosCasillerosAlOeste() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesDelBarco.add(tablero.getPosicion(5,4));
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesDelBarco.add(tablero.getPosicion(5,6));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unBuque = null;
    	try {unBuque = new Buque(posicionesDelBarco,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,1));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,4));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

    	unBuque.mover(tablero);
    	unBuque.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unBuque.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }

    @Test
    public void testDarVueltaEnElBorde() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesDelBarco.add(tablero.getPosicion(5,1));
    		posicionesDelBarco.add(tablero.getPosicion(5,0));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unBuque = null;
    	try {unBuque = new Buque(posicionesDelBarco,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,1));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,4));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

    	unBuque.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unBuque.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }

    @Test
    public void testDarVueltaEnElBordeYAvanzar() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesDelBarco.add(tablero.getPosicion(5,1));
    		posicionesDelBarco.add(tablero.getPosicion(5,0));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unBuque = null;
    	try {unBuque = new Buque(posicionesDelBarco,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,1));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,4));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

    	unBuque.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unBuque.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }

    @Test
    public void testDarVueltaEnElBordeYAvanzarDosVeces() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesDelBarco.add(tablero.getPosicion(5,1));
    		posicionesDelBarco.add(tablero.getPosicion(5,0));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unBuque = null;
    	try {unBuque = new Buque(posicionesDelBarco,new Oeste());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};
   		
    	ArrayList<Posicion> posicionesSiguientesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,2));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,3));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,4));
    		posicionesSiguientesDelBarco.add(tablero.getPosicion(5,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

    	unBuque.mover(tablero);
    	unBuque.mover(tablero);
   		
   		assertEquals("El barco esta en las posiciones correctas",unBuque.getPosicionesSanas(),posicionesSiguientesDelBarco);
    }
    
    // Pruebas de movimiento y explosiones integradas.
    @Test
    public void testAvanzarUnCasilleroMantieneLasPosicionesRotas() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(4,5));
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesDelBarco.add(tablero.getPosicion(7,5));
    		posicionesDelBarco.add(tablero.getPosicion(8,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unPortaaviones = null;
    	try {unPortaaviones = new Portaaviones(posicionesDelBarco,new Sur());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

    	ArrayList<Posicion> posicionesSanasDespuesDeMovimiento = new ArrayList<Posicion>();
    	ArrayList<Posicion> posicionesRotasDespuesDeMovimiento = new ArrayList<Posicion>();
    	try {
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(5,5));
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(7,5));
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(8,5));
    		posicionesRotasDespuesDeMovimiento.add(tablero.getPosicion(6,5));
    		posicionesRotasDespuesDeMovimiento.add(tablero.getPosicion(9,5));

    		// Explotan dos partes del barco.
    		unPortaaviones.recibirDanioDisparo(tablero.getPosicion(5,5));
    		unPortaaviones.recibirDanioDobleConRetardo(tablero.getPosicion(8,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	
    	unPortaaviones.mover(tablero);

   		assertEquals("Las partes rotas del barco se movieron correctamente",unPortaaviones.getPosicionesSanas(),posicionesSanasDespuesDeMovimiento);
   		assertEquals("Las partes sanas del barco se movieron correctamente",unPortaaviones.getPosicionesRotas(),posicionesRotasDespuesDeMovimiento);
    }

    @Test
    public void testDarVueltaYAvanzarMantieneLasPosicionesRotas() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesDelBarco.add(tablero.getPosicion(7,5));
    		posicionesDelBarco.add(tablero.getPosicion(8,5));
    		posicionesDelBarco.add(tablero.getPosicion(9,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unPortaaviones = null;
    	try {unPortaaviones = new Portaaviones(posicionesDelBarco,new Sur());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

    	ArrayList<Posicion> posicionesSanasDespuesDeMovimiento = new ArrayList<Posicion>();
    	ArrayList<Posicion> posicionesRotasDespuesDeMovimiento = new ArrayList<Posicion>();
    	try {
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(8,5));
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(6,5));
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(5,5));
    		posicionesRotasDespuesDeMovimiento.add(tablero.getPosicion(7,5));
    		posicionesRotasDespuesDeMovimiento.add(tablero.getPosicion(4,5));

    		// Explotan dos partes del barco.
    		unPortaaviones.recibirDanioMinaDeContacto(tablero.getPosicion(5,5));
    		unPortaaviones.recibirDanioTripleConRetardo(tablero.getPosicion(8,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	
    	unPortaaviones.mover(tablero);

   		assertEquals("Las partes rotas del barco se movieron correctamente",unPortaaviones.getPosicionesSanas(),posicionesSanasDespuesDeMovimiento);
   		assertEquals("Las partes sanas del barco se movieron correctamente",unPortaaviones.getPosicionesRotas(),posicionesRotasDespuesDeMovimiento);
    }

    @Test
    public void testDarVueltaYAvanzarDosVecesMantieneLasPosicionesRotas() {
    	Tablero tablero = new Tablero();
    	ArrayList<Posicion> posicionesDelBarco = new ArrayList<Posicion>();
    	try {
    		posicionesDelBarco.add(tablero.getPosicion(5,5));
    		posicionesDelBarco.add(tablero.getPosicion(6,5));
    		posicionesDelBarco.add(tablero.getPosicion(7,5));
    		posicionesDelBarco.add(tablero.getPosicion(8,5));
    		posicionesDelBarco.add(tablero.getPosicion(9,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};
    	Barco unPortaaviones = null;
    	try {unPortaaviones = new Portaaviones(posicionesDelBarco,new Sur());
    	}catch(CantidadDePosicionesIncorrectasExcepcion unError){};

    	ArrayList<Posicion> posicionesSanasDespuesDeMovimiento = new ArrayList<Posicion>();
    	ArrayList<Posicion> posicionesRotasDespuesDeMovimiento = new ArrayList<Posicion>();
    	try {
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(7,5));
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(5,5));
    		posicionesSanasDespuesDeMovimiento.add(tablero.getPosicion(4,5));
    		posicionesRotasDespuesDeMovimiento.add(tablero.getPosicion(6,5));
    		posicionesRotasDespuesDeMovimiento.add(tablero.getPosicion(3,5));

    		// Explotan dos partes del barco.
    		unPortaaviones.recibirDanioDisparo(tablero.getPosicion(5,5));
    		unPortaaviones.recibirDanioMinaDeContacto(tablero.getPosicion(8,5));
    	}catch(TableroIndiceFueraDeRangoExcepcion unError){};

    	unPortaaviones.mover(tablero);
    	unPortaaviones.mover(tablero);

   		assertEquals("Las partes rotas del barco se movieron correctamente",unPortaaviones.getPosicionesSanas(),posicionesSanasDespuesDeMovimiento);
   		assertEquals("Las partes sanas del barco se movieron correctamente",unPortaaviones.getPosicionesRotas(),posicionesRotasDespuesDeMovimiento);
    }
}
